package com.dimples.dd.system.mapper;

import com.dimples.dd.common.pojo.PageResult;
import com.dimples.dd.mybatis.core.mapper.BaseMapperX;
import com.dimples.dd.mybatis.core.query.MPJLambdaWrapperX;
import com.dimples.dd.system.enums.notice.NoticePublishStatusEnum;
import com.dimples.dd.system.model.entity.SystemNoticeDO;
import com.dimples.dd.system.model.entity.SystemUserNoticeDO;
import com.dimples.dd.system.model.entity.SystemUsersDO;
import com.dimples.dd.system.model.query.NoticePageQuery;
import com.dimples.dd.system.model.vo.UserNoticePageVO;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface SystemUserNoticeMapper extends BaseMapperX<SystemUserNoticeDO> {

    /**
     * 我的通知公告分页列表
     *
     * @param pageQuery 查询参数
     * @return 通知公告分页分页
     */
    default PageResult<UserNoticePageVO> selectMyNoticePage(NoticePageQuery pageQuery) {
        MPJLambdaWrapperX<SystemUserNoticeDO> wrapperX = new MPJLambdaWrapperX<>();
        wrapperX.innerJoin(SystemNoticeDO.class, on -> on.eq(SystemNoticeDO::getId, SystemUserNoticeDO::getNoticeId).eq(SystemNoticeDO::getPublishStatus, NoticePublishStatusEnum.PUBLISHED.getValue()))
                .leftJoin(SystemUsersDO.class, SystemUsersDO::getId, SystemNoticeDO::getPublisherId);
        wrapperX.select(SystemUserNoticeDO::getIsRead)
                .selectAs(SystemUsersDO::getNickname, UserNoticePageVO::getPublisherName)
                .select(SystemNoticeDO::getId, SystemNoticeDO::getTitle, SystemNoticeDO::getType, SystemNoticeDO::getPublishTime, SystemNoticeDO::getLevel);
        wrapperX.eq(SystemUserNoticeDO::getUserId, pageQuery.getUserId());
        wrapperX.eqIfPresent(SystemUserNoticeDO::getIsRead, pageQuery.getIsRead());
        wrapperX.likeIfPresentOther(SystemNoticeDO::getTitle, pageQuery.getTitle());
        wrapperX.orderByDesc(SystemNoticeDO::getPublishTime, SystemNoticeDO::getCreateTime);

        return this.selectJoinPage(pageQuery, UserNoticePageVO.class, wrapperX);
    }
}